#define JPEG_INTERNALS
#include "jinclude.h"
#include "jpeglib.h"

void jinit_compress_master( j_compress_ptr cinfo ) {
  jinit_c_master_control( cinfo, FALSE /* full compression */ );
  /* Preprocessing */
  if( ! cinfo->raw_data_in ) {
    jinit_color_converter( cinfo );
    jinit_downsampler( cinfo );
    jinit_c_prep_controller( cinfo, FALSE /* never need full buffer here */ );
  }
  /* Forward DCT */
  jinit_forward_dct( cinfo );
  /* Entropy encoding: either Huffman or arithmetic coding. */
  if( cinfo->arith_code ) {
    ERREXIT( cinfo, JERR_ARITH_NOTIMPL );
  } else {
    if( cinfo->progressive_mode ) {
      #ifdef C_PROGRESSIVE_SUPPORTED
      jinit_phuff_encoder( cinfo );
      #else
      ERREXIT( cinfo, JERR_NOT_COMPILED );
      #endif
    } else
    { jinit_huff_encoder( cinfo ); }
  }
  /* Need a full-image coefficient buffer in any multi-pass mode. */
  jinit_c_coef_controller( cinfo,
                           ( wxjpeg_boolean )( cinfo->num_scans > 1 || cinfo->optimize_coding ) );
  jinit_c_main_controller( cinfo, FALSE /* never need full buffer here */ );
  jinit_marker_writer( cinfo );
  /* We can now tell the memory manager to allocate virtual arrays. */
  ( *cinfo->mem->realize_virt_arrays )( ( j_common_ptr ) cinfo );
  /* Write the datastream header (SOI) immediately.
     Frame and scan headers are postponed till later.
     This lets application insert special markers after the SOI.
  */
  ( *cinfo->marker->write_file_header )( cinfo );
}
